﻿//////////////////////////////////////////////////////////////////
//
// Hester\Folder.cs
//
// Copyright (c) 2012 Dan Pike.
//
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction,
// including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software,
// and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
using DanPike.Utilities;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Hester
{
   ////////////////////////////////////////////////////////////////////////
   /// <summary>
   /// 
   /// </summary>
   public class Folder
   {
      private static Logger Logger = Program.Logger;

      public string Url;
      public List<Account> accounts_ = new List<Account>();

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      public Folder()
      {
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      public void loadAccounts(Accounts accounts, Servers servers, Toons toons)
      {
         try
         {
            Directory.EnumerateDirectories(Path.Combine(Url, @"WTF\Account")).ToList().ForEach(folderAccount =>
               {
                  // Get the global Account object
                  string accountName = Path.GetFileName(folderAccount);
                  Account account = accounts.addAccount(accountName);

                  // And remember that this folder includes this account
                  Logger.DebugFormat("Folder '{0}' includes account '{1}'", Url, accountName);
                  accounts_.Add(account);
                  account.AddFolder(this);

                  // Do the same thing for all of the servers in this folder under this account
                  Directory.EnumerateDirectories(folderAccount).ToList().ForEach(folderServer =>
                     {
                        // Servers are universal, like accounts
                        string serverName = Path.GetFileName(folderServer);
                        if ("SavedVariables" == serverName)
                        {
                           // This is a special case!
                           return;
                        }
                        Server server = servers.addServer(serverName);

                        // Tell the account that it includes characters on this server
                        account.linkServer(this, server);

                        // And add each of the toons
                        Directory.EnumerateDirectories(folderServer).ToList().ForEach(folderToon =>
                           {
                              string toonName = Path.GetFileName(folderToon);
                              if ("SavedVariables" == serverName)
                              {
                                 return;
                              }

                              Toon toon = toons.addToon(account, server, toonName);
                           });
                     });
               });
         }
         catch (System.Exception ex)
         {
            Logger.Exception(ex);
         }
      }

      ////////////////////////////////////////////////////////////////////////
      /// <summary>
      /// 
      /// </summary>
      public void Show(ListView view, Toons toons)
      {
         try
         {
            accounts_.ForEach(account => account.Show(view, this, toons));
         }
         catch (System.Exception ex)
         {
            Logger.Exception(ex);
         }
      }
   }
}
